From 5b8267028d89e665eb1ab03165b1309903ea3f9a Mon Sep 17 00:00:00 2001 From: Carlos Garnacho Date: Fri, 1 Aug 2014 17:38:42 +0200 Subject: [PATCH] window: Update popover positions on ::size-allocate Popovers may get relocations optimized away if only x/y changed in the GtkAllocation. So make sure the toplevel updates popover positions on all situations. https://bugzilla.gnome.org/show_bug.cgi?id=729140 --- gtk/Makefile.am | 1 + gtk/gtkpopover.c | 4 ++-- gtk/gtkpopoverprivate.h | 29 +++++++++++++++++++++++++++++ gtk/gtkwindow.c | 4 ++++ 4 files changed, 36 insertions(+), 2 deletions(-) create mode 100644 gtk/gtkpopoverprivate.h diff --git a/gtk/Makefile.am b/gtk/Makefile.am index e9d01ee0ef..6c4632eb07 100644 --- a/gtk/Makefile.am +++ b/gtk/Makefile.am @@ -625,6 +625,7 @@ gtk_private_h_sources = \ gtkorientableprivate.h \ gtkpango.h \ gtkpathbar.h \ + gtkpopoverprivate.h \ gtkprintoperation-private.h \ gtkprintutils.h \ gtkprivate.h \ diff --git a/gtk/gtkpopover.c b/gtk/gtkpopover.c index b660a904b4..0acb1337b9 100644 --- a/gtk/gtkpopover.c +++ b/gtk/gtkpopover.c @@ -78,6 +78,7 @@ #include #include #include "gtkpopover.h" +#include "gtkpopoverprivate.h" #include "gtktypebuiltins.h" #include "gtkmain.h" #include "gtkwindowprivate.h" @@ -143,7 +144,6 @@ struct _GtkPopoverPrivate static GQuark quark_widget_popovers = 0; static guint signals[N_SIGNALS] = { 0 }; -static void gtk_popover_update_position (GtkPopover *popover); static void gtk_popover_update_relative_to (GtkPopover *popover, GtkWidget *relative_to); @@ -761,7 +761,7 @@ opposite_position (GtkPositionType pos) } } -static void +void gtk_popover_update_position (GtkPopover *popover) { GtkPopoverPrivate *priv = popover->priv; diff --git a/gtk/gtkpopoverprivate.h b/gtk/gtkpopoverprivate.h new file mode 100644 index 0000000000..ab61eb993e --- /dev/null +++ b/gtk/gtkpopoverprivate.h @@ -0,0 +1,29 @@ +/* GTK - The GIMP Toolkit + * Copyright © 2014 Carlos Garnacho + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see . + */ + +#ifndef __GTK_POPOVER_PRIVATE_H__ +#define __GTK_POPOVER_PRIVATE_H__ + +#include "gtkpopover.h" + +G_BEGIN_DECLS + +void gtk_popover_update_position (GtkPopover *popover); + +G_END_DECLS + +#endif /* __GTK_POPOVER_PRIVATE_H__ */ diff --git a/gtk/gtkwindow.c b/gtk/gtkwindow.c index e7b336b201..4da45b0694 100644 --- a/gtk/gtkwindow.c +++ b/gtk/gtkwindow.c @@ -56,6 +56,7 @@ #include "gtkbutton.h" #include "gtkheaderbar.h" #include "gtkheaderbarprivate.h" +#include "gtkpopoverprivate.h" #include "a11y/gtkwindowaccessible.h" #include "a11y/gtkcontaineraccessibleprivate.h" #include "gtkapplicationprivate.h" @@ -7165,6 +7166,9 @@ popover_size_allocate (GtkWidget *widget, if (!popover->window) return; + if (GTK_IS_POPOVER (popover->widget)) + gtk_popover_update_position (GTK_POPOVER (popover->widget)); + popover_get_rect (popover, window, &rect); gdk_window_move_resize (popover->window, rect.x, rect.y, rect.width, rect.height); -- 2.30.2